=====================
Winsock
API Tutorial Part 5
Written
By
Mohamed
Fayed
=====================
برمجة العميلClient
سيحتوي
العميل على نفس الدوال الموجودة في mdlWinsock و mdlSubClass لأننا
سنعمل Hook على رسائل التي سيستقبلها مقبس
العميل وسننشأ لها تصنيف فرعى يدعى Winsockmain أيضا كما هو موجود فى برنامج الخادم Server وسنضيف
الآن إلى مشروع العميل فورم باسم FrmClient ونضيف الأدوات الآتية :
|
خواص |
الاسم |
الأداة |
|
_ |
Cmddisconnect |
|
|
_ |
Cmdconnect |
|
|
_ |
CmdSend |
|
|
MultiLine=True |
txtChat |
|
|
_ |
txtSend |
|
|
_ |
lblstatus |
|
والشكل النهائي للتطبيق سيكون هكذا :

بالنسبة لكود frmClient سيكون كالتالي :
Dim LlistenSocket As Long, lRetVal As Long
Private Sub Form_Load()
HookForm Me.hwnd
If WinsockInitialize = True
Then
frmClient.lblStatus =
"Winsock Service is Running"
End If
CmdDisconnect.Enabled = False
CmdSend.Enabled = False
End Sub
Private Sub Form_Unload(Cancel As Integer)
UnHookForm Me.hwnd
closesocket LlistenSocket
WSACleanup
End Sub
Private Sub CmdConnect_Click()
Dim RemoteAddr As sockaddr_in
LlistenSocket = socket(AF_INET,
SOCK_STREAM, IPPROTO_TCP)
If LlistenSocket = INVALID_SOCKET Then
frmClient.lblStatus =
"Unable to Create Socket"
Else
RemoteAddr.sin_family =
AF_INET
RemoteAddr.sin_port =
htons(CLng(2010))
RemoteAddr.sin_addr =
inet_addr("127.0.0.1")
lRetVal =
connect(LlistenSocket, RemoteAddr, Len(RemoteAddr))
If lRetVal = SOCKET_ERROR
Then
frmClient.lblStatus =
"Unable to Connect to Server"
Else
CmdConnect.Enabled = False
CmdSend.Enabled = True
CmdDisconnect.Enabled = True
End If
WSAAsyncSelect
LlistenSocket, Me.hwnd, ByVal WM_SOCKET, _
ByVal FD_CONNECT Or
FD_READ Or FD_CLOSE
End If
End Sub
Private Sub cmdDisconnect_Click()
lblStatus.Caption =
"Dissconnected"
If LlistenSocket <>
INVALID_SOCKET Then closesocket LlistenSocket
cmdConnect.Enabled = True
cmdSend.Enabled = False
cmdDisconnect.Enabled = False
End Sub
Private Sub cmdSend_Click()
Dim Msg As String
Msg = "Reply" &
txtSend.Text & vbCrLf
lRetVal = send(LlistenSocket,
ByVal Msg, Len(Msg), 0)
txtChat.Text = txtChat.Text
& Msg
txtSend.Text = ""
If lRetVal = SOCKET_ERROR Then
lblStatus = "Unable to
Send Message"
End If
End Sub
كما ترى معظم الاكواد قد رأيتها من قبل .
ومن خلال الدالة Connect() نستطيع الاتصال وهى شبيهه بالدالة bind لو كنت نسيت معاملاتها .فقط سنملئ بنية
RemoteAddr بالمعلومات اللازمة للاتصال بالطرف الأخر مثل عنوان الإنترنت
والمنفذ وعنوان العائلة الذي نستخدمه.
RemoteAddr.sin_family = AF_INET
RemoteAddr.sin_port =
htons(CLng(2010))
RemoteAddr.sin_addr =
inet_addr(127.0.01)
lRetVal = connect(LlistenSocket,
RemoteAddr, Len(RemoteAddr))
وبما أننا سنجرب البرنامج على الجهاز
المحلى فنعطيه أل LoopBack IP 127.0.0.1)) وعلى المنفذ 2010 .
فقط سيكون هناك اختلاف بسيط
في الوحدة
النمطية للتصنيف الفرعي والخاص بالأجراء Winsockmain والذي يستقبل أحداث المقبس وهذا
الاختلاف ناتج من أننا سنراقب الحدث FD_Connect بدلا من FD_Accept
فإذا استقبل المقبس الحدث FD_Connect فهذا يدل على أن الطرف الأخر قد وافق على الاتصال.
Public Function WinSockmain(ByVal hwnd
As Long, ByVal uMsg As Long, ByVal wParam As _
Long, ByVal lParam As Long) As Long
If uMsg = WM_SOCKET Then
Dim ReadBuffer(1024) As Byte, lRetVal
As Long
Select Case lParam
Case FD_CONNECT
frmClient.lblStatus.Caption = "You are Connected"
Case FD_READ
Dim data As
String
lRetVal =
recv(wParam, ReadBuffer(0), 1024, 0)
If lRetVal >
0 Then
data =
Left(StrConv(ReadBuffer, vbUnicode), lRetVal)
If
Left(Data, 5) = "Reply" Then
Data = Right(Data, Len(Data) - 5)
frmClient.txtChat.Text =
frmClient.txtChat.Text & data
End If
End If
Case FD_CLOSE
frmClient.lblStatus.Caption = "The Remote Machine Has
Disconnected"
End Select
End If
WinSockmain =
CallWindowProc(lpPrevWndProc, hwnd, uMsg,wParam, lParam)
End Function
والآن أصبح كل من العميل والخادم جاهزان للاتصال
وتبادل بيانات المحادثة.
=====================
Winsock
API Tutorial Part 5
Written
By
Mohamed
Fayed
=====================
More Info Visit The source of Network
Programming
www.vbip.com